using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using QiBu.Api.ILogic;
using QiBu.Api.IService;
using QiBu.Api.Map;
using QiBu.Api.Helper.Common;
using QiBu.Api.Enum;
/****************************************
 * 标题：应用层实现(SYS_User)
 * 描述：由T4模板统一生成
 * 开发：单车上的程序猿（2015年3月11日 21:38:53）
 * 编辑：
 * 备注：
 * *************************************/

namespace QiBu.Api.Logic
{
    /// <summary>
    /// 应用层实现(SYS_User)
    /// </summary>
    public class SYS_UserLogic : Singleton<SYS_UserLogic>, ISYS_UserLogic
    {
        #region 受保护的属性

        /// <summary>
        /// 获取或设置 用户信息数据访问对象
        /// </summary>
        private ISYS_UserService SYS_UserService { get; set; }

        private SYS_UserLogic()
        {
            this.SYS_UserService = UnityIOC.Instance.GetService<ISYS_UserService>();
        }

        #endregion

        #region 公共属性

        /// <summary>
        /// 获取 用户信息查询数据集
        /// </summary>
        public IQueryable<SYS_User> Datas
        {
            get { return SYS_UserService.Entities; }
        }

        #endregion

        #region 公共方法

        /// <summary>
        /// 插入实体记录
        /// </summary>
        /// <param name="entity"> 实体对象 </param>
        /// <param name="isSave"> 是否执行保存 </param>
        /// <returns> 操作影响的行数 </returns>
        public int Insert(SYS_User entity, bool isSave = true)
        {
            return SYS_UserService.Insert(entity, isSave);
        }

        /// <summary>
        /// 批量插入实体记录集合
        /// </summary>
        /// <param name="entities"> 实体记录集合 </param>
        /// <param name="isSave"> 是否执行保存 </param>
        /// <returns> 操作影响的行数 </returns>
        public int Insert(IEnumerable<SYS_User> entities, bool isSave = true)
        {
            return SYS_UserService.Insert(entities, isSave);
        }

        /// <summary>
        /// 删除指定编号的记录
        /// </summary>
        /// <param name="id"> 实体记录编号 </param>
        /// <param name="isSave"> 是否执行保存 </param>
        /// <returns> 操作影响的行数 </returns>
        public int Delete(object id, bool isSave = true)
        {
            return SYS_UserService.Delete(id, isSave);
        }

        /// <summary>
        /// 删除实体记录
        /// </summary>
        /// <param name="entity"> 实体对象 </param>
        /// <param name="isSave"> 是否执行保存 </param>
        /// <returns> 操作影响的行数 </returns>
        public int Delete(SYS_User entity, bool isSave = true)
        {
            return SYS_UserService.Delete(entity, isSave);
        }

        /// <summary>
        /// 删除实体记录集合
        /// </summary>
        /// <param name="entities"> 实体记录集合 </param>
        /// <param name="isSave"> 是否执行保存 </param>
        /// <returns> 操作影响的行数 </returns>
        public int Delete(IEnumerable<SYS_User> entities, bool isSave = true)
        {
            return SYS_UserService.Delete(entities, isSave);
        }

        /// <summary>
        /// 删除所有符合特定表达式的数据
        /// </summary>
        /// <param name="predicate"> 查询条件谓语表达式 </param>
        /// <param name="isSave"> 是否执行保存 </param>
        /// <returns> 操作影响的行数 </returns>
        public int Delete(Expression<Func<SYS_User, bool>> predicate, bool isSave = true)
        {
            return SYS_UserService.Delete(predicate, isSave);
        }

        /// <summary>
        /// 更新实体记录
        /// </summary>
        /// <param name="entity"> 实体对象 </param>
        /// <param name="isSave"> 是否执行保存 </param>
        /// <returns> 操作影响的行数 </returns>
        public int Update(SYS_User entity, bool isSave = true)
        {
            return SYS_UserService.Update(entity, isSave);
        }


        /// <summary>
        /// 查找指定主键的实体记录
        /// </summary>
        /// <param name="key"> 指定主键 </param>
        /// <returns> 符合编号的记录，不存在返回null </returns>
        public SYS_User GetByKey(object key)
        {
            return SYS_UserService.GetByKey(key);
        }

        /// <summary>
        /// 查找指定复合主键的实体记录
        /// </summary>
        /// <param name="key"> 指定复合主键 </param>
        /// <returns> 符合编号的记录，不存在返回null </returns>
        public SYS_User GetByKey(params object[] keyValues)
        {
            return SYS_UserService.GetByKey(keyValues);
        }

        /// <summary>
        ///根据条件表达式查询返回一条记录
        /// </summary>
        /// <param name="exp">条件表达式</param>
        /// <returns>一条记录</returns>
        public SYS_User Find(Expression<Func<SYS_User, bool>> exp)
        {
            return SYS_UserService.Find(exp);
        }

        /// <summary>
        /// 根据条件表达式查询记录
        /// </summary>
        /// <param name="exp">条件表达式</param>
        /// <returns>记录集合</returns>
        public IQueryable<SYS_User> BatchFind(Expression<Func<SYS_User, bool>> exp)
        {
            return SYS_UserService.BatchFind(exp);
        }

        /// <summary>
        /// 更新实体集合记录
        /// </summary>
        /// <param name="entities"> 实体对象集合 </param>
        /// <param name="isSave"> 是否执行保存 </param>
        /// <returns> 操作影响的行数 </returns>
        public int Update(IEnumerable<SYS_User> entities, bool isSave = true)
        {
            return SYS_UserService.Update(entities, isSave);
        }

        #endregion

        #region 扩展方法
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="password">密码</param>
        /// <param name="ip">ip地址</param>
        /// <param name="getCode">是否产生code</param>
        /// <param name="appId">应用id</param>
        /// <returns></returns>
        public SYS_User Login(string userName, string password, string ip, bool getCode = false, EnumAppId appId = EnumAppId.WebAdmin) 
        {
            var user = SYS_UserService.Find(x => x.UserName == userName && x.Status == (int)EnumRecordStatus.Enabled);
            if (user != null && user.UserId > 0)
            {
                string passwordInput = MD5AndXOREncrypt.ToMD5Lower(user.Salt + password);
                if (passwordInput == user.LoginKey) {
                    if (getCode)
                    {
                        //user.Code = UserCodeService.Instance.GetCodeByUser(user, appId);
                    }
                    return user;
                }
            }
            return null;
        }

        /// <summary>
        /// 编辑/新增
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool Edit(SYS_User model) 
        {
            if (model.UserId > 0)
            {
                return SYS_UserService.Update(model) > 0;
            }
            else
            {
                return SYS_UserService.Insert(model) > 0;
            }
        }
        #endregion
    }
}
